home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic Source Code / Visual Basic Source Code.iso / vbsource / dragdr_1 / mssubcla.bas < prev    next >
BASIC Source File  |  1998-09-14  |  6KB  |  148 lines

  1. Attribute VB_Name = "MSubclass"
  2.   Option Explicit
  3.   ' A demo project of DragDrop file routines.  This demo shows the difference
  4.   ' between using a subclassed dragdrop routine and an OLE dragdrop routine.
  5.   ' written by Bryan Stafford of New Vision Software«
  6.   ' this demo is released into the public domain "as is" without
  7.   ' warranty or guaranty of any kind.  In other words, use at
  8.   ' your own risk.
  9.  
  10.   ' See the comments at the end of this module for a brief explaination of
  11.   ' what subclassing is.
  12.   
  13.   ' max length of a path string on the system
  14.   Public Const MAX_PATH As Long = 260&
  15.   
  16.   ' the messages that we want to catch
  17.   Public Const WM_DROPFILES As Long = &H233&
  18.  
  19.  
  20.   ' this var will hold a pointer to the original message handler so we MUST
  21.   ' save it so that it can be restored before we exit the app.  if we don't
  22.   ' restore it.... CRASH!!!!
  23.   Public procOld As Long
  24.   
  25.   '
  26.   Public Declare Function CallWindowProc& Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc&, _
  27.                                                     ByVal hWnd&, ByVal Msg&, ByVal wParam&, ByVal lParam&)
  28.                                                     
  29.   ' drag and drop files APIs
  30.   Public Declare Sub DragAcceptFiles Lib "shell32.dll" (ByVal hWnd&, ByVal fAccept&)
  31.                                
  32.   Public Declare Function DragQueryFile& Lib "shell32.dll" Alias "DragQueryFileA" (ByVal hDrop&, ByVal iFile&, _
  33.                                                                                   ByVal lpszFile$, ByVal cch&)
  34.   Public Declare Sub DragFinish Lib "shell32.dll" (ByVal hDrop&)
  35.  
  36. 'WARNING!!!! WARNING!!!! WARNING!!!! WARNING!!!! WARNING!!!! WARNING!!!!
  37. '
  38. ' Do NOT try to step through this function in debug mode!!!!
  39. ' You WILL crash!!!  Also, do NOT set any break points in this function!!!
  40. ' You WILL crash!!!  Subclassing is non-trivial and should be handled with
  41. ' EXTREAME care!!!
  42. '
  43. ' There are ways to use a "Debug" dll to allow you to set breakpoints in
  44. ' subclassed code in the IDE but this was not implimented for this demo.
  45. '
  46. 'WARNING!!!! WARNING!!!! WARNING!!!! WARNING!!!! WARNING!!!! WARNING!!!!
  47.   
  48. Public Function WindowProc(ByVal hWnd As Long, ByVal iMsg As Long, _
  49.                                               ByVal wParam As Long, ByVal lParam As Long) As Long
  50.     
  51.   ' this is *our* implimentation of the message handling routine
  52.   
  53.   ' determine which message was recieved
  54.   Select Case iMsg
  55.     
  56.     ' grab the message that tells us when a file was dropped on the picturebox
  57.     Case WM_DROPFILES
  58.       ' call the sup that we defined in the form module passing wParam which is the handle to the file
  59.       frmDragDropFiles.DropFiles wParam
  60.       
  61.       ' return zero to windows and get out
  62.       WindowProc = False
  63.       Exit Function
  64.       
  65.   End Select
  66.   
  67.   ' pass all messages on to VB and then return the value to windows
  68.   WindowProc = CallWindowProc(procOld, hWnd, iMsg, wParam, lParam)
  69.  
  70. End Function
  71.  
  72. ' What is subclassing anyway?
  73. '
  74. ' Windows runs on "messages".  A message is a unique value that, when
  75. ' recieved by a window or the operating system, tells either that
  76. ' something has happened and that an action of some sort needs to be
  77. ' taken.  Sort of like your nervous system passing feeling messages
  78. ' to your brain and the brain passing movement messages to your body.
  79. '
  80. ' So, each window has what's called a message handler.  This is a
  81. ' function where all of the messages FROM Windows are recieved.  Every
  82. ' window has one.  I mean EVERY window.  That means every button, textbox,
  83. ' picturebox, form, etc...  Windows keeps track of where the message
  84. ' handler (called a WindowProc [short for PROCedure]) in a "Class"
  85. ' structure associated with each window handle (otherwise known as hWnd).
  86. '
  87. ' What happens when a window is subclassed is that you insert a new
  88. ' window procedure in line with the original window procedure.  In other
  89. ' words, Windows sends the messages for the given window to YOUR WindowProc
  90. ' FIRST where you are responsible for handling any messages you want to
  91. ' handle.  Then you MUST pass the remaining messages on to the default
  92. ' WindoProc.  So it looks like this:
  93. '
  94. '  Windows Message Sender --> Your WindowProc --> Default WindowProc
  95. '
  96. ' A window can be subclassed MANY times so it could look like this:
  97. '
  98. '  Windows Message Sender --> Your WindowProc --> Another WindowProc _
  99. '  --> Yet Another WindowProc --> Default WindowProc
  100. '
  101. ' You can also change the order of when you respond to a message by
  102. ' where in your routine you pass the message on to the default WindowProc.
  103. ' Let's say that you want to draw something on the window AFTER the
  104. ' default WindowProc handles the WM_PAINT message.  This is easily done
  105. ' by calling the default proc before you do your drawing.   Like so:
  106. '
  107. ' Public Function WindowProc(Byval hWnd, Byval etc....)
  108. '
  109. '   Select Case iMsg
  110. '     Case SOME_MESSAGE
  111. '       DoSomeStuff
  112. '
  113. '     Case WM_PAINT
  114. '       ' pass the message to the defproc FIRST
  115. '       WindowProc = CallWindowProc(procOld, hWnd, iMsg, wParam, lParam)
  116. '
  117. '       DoDrawingStuff ' <- do your drawing
  118. '
  119. '       Exit Function ' <- exit since we already passed the
  120. '                     '    measage to the defproc
  121. '
  122. '   End Select
  123. '
  124. '   ' pass all messages on to VB and then return the value to windows
  125. '   WindowProc = CallWindowProc(procOld, hWnd, iMsg, wParam, lParam)
  126. '
  127. ' End Function
  128. '
  129. '
  130. ' This is just a basic overview of subclassing but I hope it helps if
  131. ' you were fuzzy about the subject before reading this.
  132. '
  133.  
  134.  
  135.  
  136.  
  137.  
  138.  
  139.  
  140.  
  141.  
  142.  
  143.  
  144.  
  145.  
  146.  
  147.  
  148.